Through Their Eyes: A Global Look at Child Deprivation

Sri Sowmya Teja Bikkina | Student ID - 42919

Introduction

Millions of children worldwide face more than poverty—they endure lost opportunities, insecurity, and indignity. This report examines children suffering multiple deprivations in education, healthcare, water, and nutrition—not as statistics, but as stolen childhoods.

Using UNICEF data, we reveal where deprivation hits hardest, how gender and geography intersect, and why economic growth alone fails to solve this crisis. Through maps, trends, and disparities, we expose systemic inequalities demanding urgent action.

No child should be left behind—especially not twice. This is a call to ensure every child can thrive.

Code
import polars as pl
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots


color_sequence = [
    "#ff4800", "#ff5400", "#ff6000", "#ff6d00", "#ff7900",
    "#ff8500", "#ff9100", "#ff9e00", "#ffaa00", "#ffb600"
]


df = (
    pl.read_csv("unicef_indicator_1 (2).csv")
    .with_columns(
        pl.col("country").str.replace('"', "").str.strip_chars(),
        pl.col("obs_value").cast(pl.Float32),
        pl.col("time_period").cast(pl.Int32)
    )
    .with_columns(
        pl.when(pl.col("country") == "Namibia")
        .then(pl.lit("NAM"))
        .otherwise(pl.col("alpha_3_code"))
        .alias("alpha_3_code_clean")
    )
    .drop_nulls(subset=["obs_value"])
)

country_region_mapping = {
    'Afghanistan': 'Asia',
    'Albania': 'Europe',
    'Algeria': 'Africa',
    'American Samoa': 'Oceania',
    'Andorra': 'Europe',
    'Angola': 'Africa',
    'Antigua and Barbuda': 'Americas',
    'Argentina': 'Americas',
    'Armenia': 'Asia',
    'Aruba': 'Americas',
    'Australia': 'Oceania',
    'Austria': 'Europe',
    'Azerbaijan': 'Asia',
    'Bahamas': 'Americas',
    'Bahrain': 'Asia',
    'Bangladesh': 'Asia',
    'Barbados': 'Americas',
    'Belarus': 'Europe',
    'Belgium': 'Europe',
    'Belize': 'Americas',
    'Benin': 'Africa',
    'Bermuda': 'Americas',
    'Bhutan': 'Asia',
    'Bolivia, Plurinational State of': 'Americas',
    'Bosnia and Herzegovina': 'Europe',
    'Botswana': 'Africa',
    'Brazil': 'Americas',
    'Virgin Islands, British': 'Americas',
    'Brunei': 'Asia',
    'Bulgaria': 'Europe',
    'Burkina Faso': 'Africa',
    'Burundi': 'Africa',
    'Cape Verde': 'Africa',
    'Cambodia': 'Asia',
    'Cameroon': 'Africa',
    'Canada': 'Americas',
    'Cayman Islands': 'Americas',
    'Central African Republic': 'Africa',
    'Chad': 'Africa',
    'Chile': 'Americas',
    'China': 'Asia',
    'Colombia': 'Americas',
    'Comoros': 'Africa',
    'Congo, the Democratic Republic of the': 'Africa',
    'Congo': 'Africa',
    'Costa Rica': 'Americas',
    'Ivory Coast': 'Africa',
    'Croatia': 'Europe',
    'Cuba': 'Americas',
    'Cyprus': 'Asia', 
    'Czech Republic': 'Europe',
    'Denmark': 'Europe',
    'Djibouti': 'Africa',
    'Dominica': 'Americas',
    'Dominican Republic': 'Americas',
    'Ecuador': 'Americas',
    'Egypt': 'Africa', 
    'El Salvador': 'Americas',
    'Equatorial Guinea': 'Africa',
    'Eritrea': 'Africa',
    'Estonia': 'Europe',
    'Swaziland': 'Africa',
    'Ethiopia': 'Africa',
    'Faroe Islands': 'Europe',
    'Fiji': 'Oceania',
    'Finland': 'Europe',
    'France': 'Europe',
    'French Polynesia': 'Oceania',
    'Gabon': 'Africa',
    'Gambia': 'Africa',
    'Georgia': 'Asia',
    'Germany': 'Europe',
    'Ghana': 'Africa',
    'Gibraltar': 'Europe',
    'Greece': 'Europe',
    'Greenland': 'Americas',
    'Grenada': 'Americas',
    'Guam': 'Oceania',
    'Guatemala': 'Americas',
    'Guinea': 'Africa',
    'Guinea-Bissau': 'Africa',
    'Guyana': 'Americas',
    'Haiti': 'Americas',
    'Honduras': 'Americas',
    'Hong Kong': 'Asia',
    'Hungary': 'Europe',
    'Iceland': 'Europe',
    'India': 'Asia',
    'Indonesia': 'Asia',
    'Iran, Islamic Republic of': 'Asia',
    'Iraq': 'Asia',
    'Ireland': 'Europe',
    'Isle of Man': 'Europe',
    'Israel': 'Asia',
    'Italy': 'Europe',
    'Jamaica': 'Americas',
    'Japan': 'Asia',
    'Jordan': 'Asia',
    'Kazakhstan': 'Asia', 
    'Kenya': 'Africa',
    'Kiribati': 'Oceania',
    "Korea, Democratic People's Republic of": 'Asia',
    'South Korea': 'Asia',
    'Kuwait': 'Asia',
    'Kyrgyzstan': 'Asia',
    "Lao People's Democratic Republic": 'Asia',
    'Latvia': 'Europe',
    'Lebanon': 'Asia',
    'Lesotho': 'Africa',
    'Liberia': 'Africa',
    'Libyan Arab Jamahiriya': 'Africa', 
    'Liechtenstein': 'Europe',
    'Lithuania': 'Europe',
    'Luxembourg': 'Europe',
    'Macao': 'Asia',
    'Madagascar': 'Africa',
    'Malawi': 'Africa',
    'Malaysia': 'Asia',
    'Maldives': 'Asia',
    'Mali': 'Africa',
    'Malta': 'Europe',
    'Marshall Islands': 'Oceania',
    'Mauritania': 'Africa',
    'Mauritius': 'Africa',
    'Mexico': 'Americas',
    'Micronesia, Federated States of': 'Oceania',
    'Moldova, Republic of': 'Europe',
    'Monaco': 'Europe',
    'Mongolia': 'Asia',
    'Montenegro': 'Europe',
    'Morocco': 'Africa',
    'Mozambique': 'Africa',
    'Myanmar': 'Asia',
    'Nauru': 'Oceania',
    'Nepal': 'Asia',
    'Netherlands': 'Europe',
    'New Caledonia': 'Oceania',
    'New Zealand': 'Oceania',
    'Nicaragua': 'Americas',
    'Niger': 'Africa',
    'Nigeria': 'Africa',
    'Macedonia, the former Yugoslav Republic of': 'Europe', 
    'Northern Mariana Islands': 'Oceania',
    'Norway': 'Europe',
    'Oman': 'Asia',
    'Pakistan': 'Asia',
    'Palau': 'Oceania',
    'Panama': 'Americas',
    'Papua New Guinea': 'Oceania',
    'Paraguay': 'Americas',
    'Peru': 'Americas',
    'Philippines': 'Asia',
    'Poland': 'Europe',
    'Portugal': 'Europe',
    'Puerto Rico': 'Americas',
    'Qatar': 'Asia',
    'Romania': 'Europe',
    'Russian Federation': 'Europe', 
    'Rwanda': 'Africa',
    'Samoa': 'Oceania',
    'San Marino': 'Europe',
    'Sao Tome and Principe': 'Africa',
    'Saudi Arabia': 'Asia',
    'Senegal': 'Africa',
    'Serbia': 'Europe',
    'Seychelles': 'Africa',
    'Sierra Leone': 'Africa',
    'Singapore': 'Asia',
    'Slovakia': 'Europe',
    'Slovenia': 'Europe',
    'Solomon Islands': 'Oceania',
    'Somalia': 'Africa',
    'South Africa': 'Africa',
    'South Sudan': 'Africa',
    'Spain': 'Europe',
    'Sri Lanka': 'Asia',
    'Saint Kitts and Nevis': 'Americas',
    'Saint Lucia': 'Americas',
    'St. Vincent and the Grenadines': 'Americas',
    'Sudan': 'Africa',
    'Suriname': 'Americas',
    'Sweden': 'Europe',
    'Switzerland': 'Europe',
    'Syrian Arab Republic': 'Asia',
    'Tajikistan': 'Asia',
    'Tanzania, United Republic of': 'Africa',
    'Thailand': 'Asia',
    'Timor-Leste': 'Asia',
    'Togo': 'Africa',
    'Tonga': 'Oceania',
    'Trinidad and Tobago': 'Americas',
    'Tunisia': 'Africa',
    'Turkey': 'Asia',
    'Turkmenistan': 'Asia',
    'Turks and Caicos Islands': 'Americas',
    'Tuvalu': 'Oceania',
    'Uganda': 'Africa',
    'Ukraine': 'Europe',
    'United Arab Emirates': 'Asia',
    'United Kingdom': 'Europe',
    'United States': 'Americas',
    'Uruguay': 'Americas',
    'Uzbekistan': 'Asia',
    'Vanuatu': 'Oceania',
    'Venezuela, Bolivarian Republic of': 'Americas',
    'Vietnam': 'Asia',
    'Virgin Islands, U.S.': 'Americas',
    'Palestinian Territory, Occupied': 'Asia',
    'Yemen': 'Asia',
    'Zambia': 'Africa',
    'Zimbabwe': 'Africa',
    'Namibia':'Africa'
}

Visualizing the Crisis: Uncovering Patterns of Child Deprivation

Child Deprivation by Country and Gender (2018)

Code
plot_df = df.filter(pl.col("sex").is_in(["Female", "Male"]) & (pl.col("time_period") == 2018))
fig1 = px.bar(
    plot_df.to_pandas(),
    x="country",
    y="obs_value",
    color="sex",
    barmode="group",
    title="",
    labels={"obs_value": "Deprivation (%)", "country": "Country", "sex": "Gender"},
    color_discrete_sequence=["#ffb600", "#ff6d00"] )
fig1.update_layout(
    plot_bgcolor="#fff",
    paper_bgcolor="#fff",
    font=dict(family="Arial", color="#333333"),
    title={"x": 0.5, "xanchor": "center", "font": {"size": 20}},
    xaxis=dict(showgrid=False),
    yaxis=dict(range=[0, plot_df["obs_value"].max() * 1.1]),
    hoverlabel=dict(bgcolor="#333333", font=dict(color="white")),
    legend=dict(title_text="<b>Gender</b>"),
    bargap=0.5, 
    bargroupgap=0.1,  

)
fig1.update_traces(
    marker_line_width=1,
    marker_line_color="#fff5eb",
    opacity=0.9,
    texttemplate="%{y:.1f}%",
    textposition="outside",
    
)
fig1.show()

what we can see:

The graph tells a quiet tragedy—rows of countries with percentages that seem small until you realize each number represents children deprived of basic rights. In Costa Rica, 2.7% and 1.9% might sound insignificant, but that’s thousands of children missing school, drinking dirty water, or going to bed hungry. In Nigeria, around 50% hides entire neighborhoods where boys scavenge for scraps while girls fetch water instead of holding pencils. Madagascar’s bar stretches to 70%, towering over other nations. This isn’t just a statistic. It’s seven out of ten children waking up to deprivation’s cruel grip: empty classrooms instead of lessons, muddy ponds instead of clean water, hunger pains instead of breakfast. These numbers aren’t just data. They’re choices. The choice to ignore, or to act. Because deprivation isn’t fate—it’s failure. And every child deserves more than a line on a chart. What if your childhood was reduced to a percentage?

Latest Child Deprivation by Country

Code
latest_df = (
    df.sort("time_period", descending=True)
    .group_by("country")
    .first()
    .select(["country", "alpha_3_code_clean", "obs_value"])
)
fig2 = px.choropleth(
    latest_df.to_pandas(),
    locations="alpha_3_code_clean",
    color="obs_value",
    hover_name="country",
    projection="natural earth",
    color_continuous_scale=color_sequence[::-1],
    labels={"obs_value": "Deprivation (%)"}
)
fig2.update_layout(paper_bgcolor="#fff", plot_bgcolor="#fff")
fig2.show()

what we can see:

In countries where the deprivation rate climbs toward double digits, we find classrooms without teachers, clinics without medicine, and homes without hope. A 5% rate in one nation might represent urban slums where children work instead of learn, while another country’s 2% could mask remote villages where girls walk hours for water instead of attending school.The most disturbing truth? These numbers represent systemic failures, not fate. Each percentage point reflects policy choices, economic priorities, and our collective willingness—or unwillingness—to act.

The question isn’t what these numbers show, but what we’ll do about them. Because behind every data point is a child who deserves more than to become a statistic in next year’s report.

Countries with Largest Gender Deprivation Gap

Code
gap_df = (
    df.filter(pl.col("sex").is_in(["Female", "Male"]))
    .pivot(values="obs_value", index=["country", "time_period"], columns="sex")
    .with_columns((pl.col("Male") - pl.col("Female")).abs().alias("gap"))
    .group_by("country")
    .agg(pl.col("gap").mean())
    .sort("gap", descending=True)
    .head(5)
)

top_countries = gap_df.get_column("country").to_list()
bar_df = (
    df.filter(pl.col("country").is_in(top_countries) & 
             pl.col("sex").is_in(["Female", "Male"]))
    .group_by(["country", "sex"])
    .agg(pl.col("obs_value").mean())
    .sort("country")
)

fig = px.bar(
    bar_df.to_pandas(),
    x="country",
    y="obs_value",
    color="sex",
    barmode="group",
    labels={"obs_value": "Deprivation (%)", "country": "Country"},
    color_discrete_map={"Female": "#ff6d00", "Male": "#ffb600"},  
    text_auto=".1f"
)


for row in gap_df.iter_rows(named=True):
    country = row['country']
    gap_value = row['gap']
    country_values = bar_df.filter(pl.col("country") == country)
    max_value = country_values["obs_value"].max()
    fig.add_annotation(
        x=country,
        y=max_value + 5,
        text=f"Gap: {gap_value:.1f}%",
        showarrow=False,
        yshift=10,
        font=dict(size=12, color="#333333")
    )

fig.update_layout(
    yaxis_range=[0, bar_df["obs_value"].max() + 15],
    plot_bgcolor='white',
    paper_bgcolor='white',
    font=dict(family="Arial", size=12, color="#333333"),
    legend=dict(
        title_text='<b>Gender</b>',
        orientation='h',
        yanchor='bottom',
        y=1.02,
        xanchor='right',
        x=1
    ),
    margin=dict(l=20, r=20, t=40, b=60)
)


fig.update_traces(
    marker_line_width=1,
    marker_line_color='white',
    width=0.4, 
    opacity=0.9,
    textposition='outside'
)

fig.show()

The Distance Between Numbers and lives:

A 3.0% gap means a Pakistani girl watches her brother walk to school while she tends the house. A 3.5% gap in Yemen means a woman’s hands work while her mind dreams of classrooms. In Iraq’s 3.8% gap, a mother’s wages feed her family but not her aspirations. Haiti and Tanzania show high deprivation for all - not a competition of suffering, but a shared struggle. These percentages aren’t just data; they’re the space between potential and reality.

The true measure of progress isn’t in closing gaps, but in valuing every life equally - not just on paper, but in practice. When we see numbers, we must remember: behind each percentage point are real people, waiting.

Average Child Deprivation by Continent

Code
df = df.with_columns(pl.col("country").replace(country_region_mapping).alias("region"))

avg_by_region = (
    df.filter(pl.col("sex") == "Total")
    .group_by("region")
    .agg(pl.col("obs_value").mean().alias("avg_deprivation"))
    .sort("avg_deprivation", descending=True)
)
fig = px.treemap(
    avg_by_region.to_pandas(),
    path=["region"],
    values="avg_deprivation",
    color="avg_deprivation",
    color_continuous_scale=color_sequence[::-1],
    title="Average Deprivation by Region (Treemap)"
)

fig.update_layout(
    paper_bgcolor="#fff5eb",
    coloraxis_colorbar=dict(
        title="Avg Deprivation (%)",
        tickformat=".1f",
        ticks="outside",
        len=0.7,
        thickness=15
    )
)
fig.show()

The Uneven World We Built

The data reveals significant regional variation in child deprivation, with Africa (-40.0%) and Asia (-30.0%) experiencing markedly higher rates than Europe (-10.0%) and Oceania. These disparities invite analysis of both structural and contextual factors shaping child welfare outcomes.

Historical patterns of economic integration, resource distribution, and social policy development may contribute to these uneven outcomes. The persistence of such gaps suggests that deprivation is not randomly distributed but influenced by larger-scale systemic forces.

This variation underscores the limitations of evaluating deprivation solely through national-level metrics, as regional and global interdependencies play measurable roles in welfare outcomes.

Key Consideration: How can policymakers address deprivation disparities in ways that account for both local conditions and broader structural influences?

Life Vs GDP

Code
import pandas as pd
import numpy as np
import plotly.express as px


df = pd.read_csv('unicef_metadata (2).csv')


df.rename(columns={
    'country': 'Country',
    'GDP per capita (constant 2015 US$)': 'GDP',
    'Life expectancy at birth, total (years)': 'Life',
    'year': 'Year'
}, inplace=True)


df = df[df['Year'] == 2022]


df = df.dropna(subset=['GDP', 'Life'])

df['GDP'] = pd.to_numeric(df['GDP'], errors='coerce')
df['Life'] = pd.to_numeric(df['Life'], errors='coerce')
df = df.dropna(subset=['GDP', 'Life'])

df['GDP'] = df['GDP'].round(2)
df['Life'] = df['Life'].round(2)
df['Region'] = df['Country'].map(country_region_mapping)
df = df.dropna(subset=['Region'])


if not df.empty:
    slope, intercept = np.polyfit(df['GDP'], df['Life'], 1)
    df['Regression'] = slope * df['GDP'] + intercept
else:
    print("No data for 2023 after filtering.")
    df['Regression'] = np.nan  

orange_palette = ['#ff4800', '#ffa500', '#ff6f00', '#ffb300', '#ff8c00',
                  '#f57c00', '#fb8c00', '#e65100', '#ff7043', '#ffcc80']


fig = px.scatter(df, x='GDP', y='Life', color='Region',
                 hover_name='Country',
                 color_discrete_sequence=orange_palette,
                 title='Life Expectancy vs GDP (2023)')


if df['Regression'].notna().any():
    fig.add_traces(px.line(df.sort_values('GDP'), x='GDP', y='Regression').data)


regions = df['Region'].unique()
buttons = [
    dict(label="All", method="update",
         args=[{"visible": [True] * len(fig.data)},
               {"title": "Life Expectancy vs GDP - All Regions (2023)"}])
]

for region in regions:
    visibility = [(trace.name == region or trace.name is None) for trace in fig.data]
    buttons.append(
        dict(label=region, method="update",
             args=[{"visible": visibility},
                   {"title": f"Life Expectancy vs GDP - {region} (2023)"}])
    )


fig.update_layout(
    plot_bgcolor='white',
    paper_bgcolor='white',
    updatemenus=[dict(
        active=0,
        buttons=buttons,
        x=0.5,
        xanchor="left",
        y=1.15,
        yanchor="top"
    )],
    xaxis_title='GDP per Capita (constant 2015 US$)',
    yaxis_title='Life Expectancy (years)',
    legend=dict(
        title="Region",
        x=1.02,
        y=1,
        bgcolor='white'
    )
)

fig.show()

The Stark Connection: Child Deprivation and National Lifespan:

Where children suffer, nations stagnate. In Africa, with life expectancy between 60-70 years, widespread child deprivation fuels a cycle of poor health, shrinking workforces, and low GDP. In the Americas, wealth buffers some, but disparities persist, shortening lives, especially in the U.S. In Europe, strong welfare systems and early investments lead to longer, healthier lives. Asia shows both hope and struggle: countries like South Korea thrive by reducing child deprivation, while others remain trapped in poverty. The graph highlights a harsh truth: a nation’s future lifespan is written in the first 1,000 days of its children’s lives, with every point of deprivation stealing years from national life expectancy.

Conclusion

Childhood should be sacred—a time of safety, discovery, and dreams. But for too many, it is a daily struggle against hunger, neglect, and despair. The data tells a story of inequality so deep that where a child is born determines whether they will flourish or merely survive. Some nations cradle their young with care, while others leave them to face the world alone.

This is not just a problem to be solved, but a moral failure to be confronted. Every child abandoned to deprivation is a promise broken, a light dimmed before its time. We have the means to rewrite this story—not with pity, but with justice. The question is no longer what can be done, but why haven’t we done it yet?